<?php
class db_sql 
{
    
    /**
     * Instance connexion
     * */
    public $open_link;
    
    /**
     * Nombre de resultat
     * */
    public $nb_resultat;
    
    /**
     * Instance PDO
     * */
    private $pdo;
    
    /**
     * Specifique a PDO contient le contenue de la derniere requete statement
     * */
    //public $_query = null;
    private static $_query = null;
    
    /**
     * active le debbug SQL
     * */
    protected $_debug = true;
    
    /**
     * Permet de se connecter a l appel de la class
     * */
    protected $_autoconnect = false;
    
    /**
     * constructeur de la class
     * 
     * @param $param array : contient les differents parametre de la class pour un ajustement perso
     * @param $basesql : information de connexion
     * */
    public function __construct($param = null, $basesql = null)
    {
        if( !is_null($param) && is_array($param))
        {
            foreach($param as $key => $value)
            {
                $this->$key = $value;
            }
        }
        
        if($this->_autoconnect === true && !is_null($basesql))
            $this->sql_connect($basesql);
    }
    
    public function sql_connect($basesql)
    {
        $this->pdo =  new pdo('mysql:host='. $basesql['serveur'] .';dbname='. $basesql['base'], $basesql['user'], $basesql['password']);
       // $this->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
        
        if(is_null($this->pdo) && $this->_debug === true) 
            echo 'Error connect database';
            
        $this->open_link = $this->pdo;
    }
    
    /**
     * @desc Excute une requete de type query
     * 
     * @param $Query : requete a excuter
     * @param $mod : formatage retour requete
     * @return $res
     * */
    public function query($Query, $mod = null)
    {
        // Verification du curseur
        //if( !is_null($this->_query) )
        //    $this->_query->closeCursor();
        if( self::$_query !== false && !is_null(self::$_query)  )
            self::$_query->closeCursor();
        
        //Execution de la requete    
        $res = $this->pdo->query($Query);
        
        self::$_query=&$res;
        
        // Affichage error
        if($res === false && $this->_debug === true)
            echo 'Query error : ' . $Query;
        
        // Traitement retour de requete
        if( !is_null($mod) )
        {
            $res = $this->fetch($res, $mod);
            self::$_query->closeCursor();  
        }
                    
        
        // Enregistrement du curseur
        
        
        //Envoie du resultat        
        return $res;             
    }
    
    /**
     * Execute une requete de type : DELETE, INSERT, UPDATE
     * 
     * @param $Query : contient la requete
     * @return Nombre d element affecte par la requete
     * */
    public function execute($Query)
    {
        return $this->pdo->exec($Query);
    }
    
    public function fetch(PDOstatement $Sql, $mod = null)
    {
       if( is_null($mod) ) 
        return $Sql->fetch($mod);
       else
       {
           switch($mod)
           {
                case 'OBJ':
                return $Sql->fetch(PDO::FETCH_OBJ);
                break;
                
                case 'BOTH':
                return $Sql->fetch();
                break;
           }
       }
    }
    
    /**
     * Retourne tout les resultats sous forme de tableau
     * 
     * @param Instance SQL
     * */
    public function fetchAll($Sql)
    {
        $resultat = $Sql->fetchAll();
        $Sql->closeCursor();
        return $resultat;
    }
    
    /**
     * Retourne le nombre de resultat de la requete SELECT
     * 
     * @param $Sql
     * @param $Query : doit etre du type SELECT COUNT(xx) FROM ma_table WHERE mes_conditions
     * */
    public function sql_nbresultat($Sql = null, $Query = null)
    {   
        // Excution requete
        $resultat = $this->pdo->query($Query);
        
        // Recuperation de la valeur
        $this->nb_resultat = $resultat->fetchColumn();

        return $this->nb_resultat;
    }
    
    public function sql_close()
    {
        $this->pdo = null;
    }
}
?>
